/**
 * javascript 函数库文件
 */

/**
 * 通过id获取元素对象
 * @param id
 * @returns {HTMLElement | null}
 */
function getObj(id) {
    return document.getElementById(id);
}

/**
 * 获取指定控件（带value属性）的内容
 * @param id
 * @returns {*}
 */
function getValue(id) {
    let e = getObj(id);
    if (e) return e.value;
}

/**
 * 将内容显示到指定控件上（带value属性）
 * @id string html的ID属性
 * @vl 值
 */
function setValue(id, vl) {
    let e = getObj(id);
    if (e) e.value = vl;
}

/**
 * 将内容(html)显示到指定控件上。
 * @id string html的ID属性
 * @html string html代码
 */
function setHtml(id, html) {
    if ("string" === typeof(id)) {
        let ele = getObj(id);
        if (ele != null) {
            ele.innerHTML = html == null ? "" : html;
        }
    } else if (id != null) {
        id.innerHTML = html == null ? "" : html;
    }
}

/**
 * 变量是否存在或已经定义
 * @para var 直接传入变量即可
 */
function isDefine(para) {
    return !(typeof para === 'undefined' || para === '' || para === null || para === undefined);
}

/**
 * console log 方法
 * @param param
 */
function cLog(param) {
    console.log(param);
}

/**
 * 获取当前时间
 */
function getTime() {
    return Math.round(new Date().getTime() / 1000);
}

/**
 * 判断值是否在数组里(可以使用jquery.inArray)
 * @var 查询的值
 * @array 数组
 */
function inIndexArray(val, array) {
    for (var x in array) {
        if (val == array[x]) {
            return true;
        };
    }
    return false;
}

/**
 * 高精度加法
 */
function floatAdd(arg1, arg2)  {
    var  r1, r2, m;
    try {
        r1 = arg1.toString().split(".")[1].length;
    } catch (e) {
        r1 = 0;
    }
    try {
        r2 = arg2.toString().split(".")[1].length;
    } catch (e) {
        r2 = 0;
    }
    m = Math.pow(10, Math.max(r1, r2));
    return  (arg1 * m + arg2 * m) / m;
}

/**
 * 高精度减法 arg1-arg2
 */
function floatSub(arg1, arg2)  {
    var  r1, r2, m, n;
    try {
        r1 = arg1.toString().split(".")[1].length;
    } catch (e) {
        r1 = 0;
    }
    try {
        r2 = arg2.toString().split(".")[1].length;
    } catch (e) {
        r2 = 0;
    }
    m = Math.pow(10, Math.max(r1, r2));       //动态控制精度长度  

    n = (r1 >= r2) ? r1 : r2;
    return  ((arg1 * m - arg2 * m) / m).toFixed(n);
}

/**
 * 高精度乘法
 */
function floatMul(arg1, arg2)  {
    var  m = 0,
        s1 = arg1.toString(),
        s2 = arg2.toString();
    try {
        m += s1.split(".")[1].length;
    } catch (e) {}
    try {
        m += s2.split(".")[1].length;
    } catch (e) {}
    return  Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m)   ;
}

/**
 * 高精度除法 arg1/arg2
 */
function floatDiv(arg1, arg2)  {
    var  t1 = 0,
        t2 = 0,
        r1, r2;
    try {
        t1 = arg1.toString().split(".")[1].length;
    } catch (e) {}
    try {
        t2 = arg2.toString().split(".")[1].length;
    } catch (e) {}
    with(Math) {
        r1 = Number(arg1.toString().replace(".", ""));
        r2 = Number(arg2.toString().replace(".", ""));
        return  (r1 / r2) * pow(10, t2 - t1);
    }
}

//保留两位小数
//功能：将浮点数四舍五入，取小数点后2位
function toDecimal(x) {
    var f = parseFloat(x);
    if (isNaN(f)) {
        return false;
    }
    var f = Math.round(f * 100) / 100;
    var s = f.toString();
    var rs = s.indexOf('.');
    if (rs < 0) {
        rs = s.length;
        s += '.';
    }
    while (s.length <= rs + 2) {
        s += '0';
    }
    return s;
}

/**
 * 取String 或者 object的长度
 *
 * */
function count(o) {
    var t = typeof o;
    if (t == 'string') {
        return o.length;
    } else if (t == 'object') {
        var n = 0;
        for (var i in o) {
            n++;
        }
        return n;
    }
    return false;
}

/**
 * 求数组的交集
 *
 * */
function arrayIntersection(a, b) { // 交集
    var result = [];
    for (var i = 0; i < b.length; i++) {
        var temp = b[i];
        for (var j = 0; j < a.length; j++) {
            if (temp === a[j]) {
                result.push(temp);
                break;
            }
        }
    }
    return arrayRemoveRepeat(result);
}

/**
 * 求数组的差集
 *
 * */
function arrayDifference(a, b) { // 差集 a - b
    //clone = a
    var clone = a.slice(0);
    for (var i = 0; i < b.length; i++) {
        var temp = b[i];
        for (var j = 0; j < clone.length; j++) {
            if (temp === clone[j]) {
                //remove clone[j]
                clone.splice(j, 1);
            }
        }
    }
    return arrayRemoveRepeat(clone);
}

/**
 * 数组去重
 *
 * */
function arrayRemoveRepeat(a) { // 去重
    var r = [];
    for (var i = 0; i < a.length; i++) {
        var flag = true;
        var temp = a[i];
        for (var j = 0; j < r.length; j++) {
            if (temp === r[j]) {
                flag = false;
                break;
            }
        }
        if (flag) {
            r.push(temp);
        }
    }
    return r;
}

/**
 * [storageSave 设置本地缓存]
 * @param  {[type]} objectData [description]
 * @return {[type]}            [description]
 */
function storageSave(objectData) {
    localStorage.setItem(objectData.Name, JSON.stringify(objectData));
}

/**
 * [storageLoad 获取本地缓存]
 * @param  {[type]} objectName [description]
 * @return {[type]}            [description]
 */
function storageLoad(objectName) {
    if (localStorage.getItem(objectName)) {
        return JSON.parse(localStorage.getItem(objectName))
    } else {
        return false
    }
}


/**
 * 判断变量是否存在
 * @param variableName
 * @returns {boolean}
 */
function isExitsVariable(variableName) {
    try {
        if (typeof(variableName) === "undefined") {
            return false;
        } else {
            return true;
        }
    } catch (e) {}
    return false;
}

/**
 * 判断函数是否存在
 * @param funcName
 * @returns {boolean}
 */
function isExitsFunction(funcName) {
    try {
        if (typeof(eval(funcName)) === "function") {
            return true;
        }
    } catch(e) {}
    return false;
}



/**
 * [escape2Html description]
 * @param  {[type]} str [description]
 * @return {[type]}     [description]
 */
function escape2Html(str) {
    let arrEntities = {
        'lt': '<',
        'gt': '>',
        'nbsp': ' ',
        'amp': '&',
        'quot': '"'
    };
    return str.replace(/&(lt|gt|nbsp|amp|quot);/ig, function(all, t) {
        return arrEntities[t];
    });
}